In Elixir, il trattamento dei dati segue due filosofie distinte: Avaro (Avanzato) e Lento. Comprendere il compromesso è fondamentale per l'efficienza della memoria e la stabilità del sistema.
1. Il protocollo Enumerable
Tecnicamente, cose che possono essere iterate si dice che implementino il protocollo Enumerable. Questo contratto comune permette a strutture dati diverse di funzionare con lo stesso insieme di funzioni.
2. Moduli Avaro vs. Lento
Il modulo Enum è avaro. Potrebbe consumare immediatamente tutti i contenuti di una raccolta, creando liste intermedie a ogni passaggio della pipeline. Al contrario, il modulo Stream è lento. Il valore successivo viene calcolato solo quando è necessario.
3. Specifica vs. Risultato
Un valore Stream è una specifica di ciò che intendevamo, ma non il risultato. I flussi sono enumerabili e componibili, consentendoti di applicare trasformazioni successive senza eseguire lavoro fino a quando non passi il flusso a un "sink" avido come Enum.to_list/1.
4. Purezza del paradigma
Combinare paradigmi (funzionale e orientato agli oggetti) riduce i benefici offerti da un approccio funzionale. Prediligi le trasformazioni dichiarative rispetto ai cicli imperativi per maggiore prevedibilità.